println!
-> stdout
eprintln!
-> stderr
터미널 출력은 느리다. 그렇기 때문에 println!
같은걸 루프에서 호출하면 아무리 빠른 프로그램이라도 느려진다. 이걸 좀 빠르게 하기위한 방법은 다음이 있다:
터미널을 청소("flush")하는 쓰기 동작을 최소화하라.
println!
은 호출될 때마다 flush동작을 한다. 새로운 줄에 출력하는 것이 일반적이기 때문이다. 이게 필요 없다면 stdout
을 BufWriter
에서 처리하도록 변경한다.
#![allow(unused)]
fn main() {
use std::io::{self, Write};
let stdout = io::stdout(); // get the global stdout entity
let mut handle = io::BufWriter::new(stdout); // optional: wrap that handle in a buffer
writeln!(handle, "foo: {}", 42); // add `?` if you care about errors here
}
stdout
을 lock시키고 writeln!
을 이용하여 직접 출력한다. 이렇게 하면 시스템이 자동적으로 lock/unlock 하는 과정을 생략할 수 있다.
#![allow(unused)]
fn main() {
use std::io::{self, Write};
let stdout = io::stdout(); // get the global stdout entity
let mut handle = stdout.lock(); // acquire a lock on it
writeln!(handle, "foo: {}", 42); // add `?` if you care about errors here
}
fn main() {
let pb = indicatif::ProgressBar::new(100);
for i in 0..100 {
do_hard_work();
pb.println(format!("[+] finished #{}", i));
pb.inc(1);
}
pb.finish_with_message("done");
}